home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d18 / lzhtv10.arc / DOSMEM.PAS < prev    next >
Pascal/Delphi Source File  |  1989-04-21  |  2KB  |  98 lines

  1.  
  2. (*
  3.  * Copyright 1987, 1989 Samuel H. Smith;  All rights reserved
  4.  *
  5.  * This is a component of the ProDoor System.
  6.  * Do not distribute modified versions without my permission.
  7.  * Do not remove or alter this notice or any other copyright notice.
  8.  * If you use this in your own program you must distribute source code.
  9.  * Do not use any of this in a commercial product.
  10.  *
  11.  *)
  12.  
  13. (*
  14.  * dosmem - Dos Memory Management Unit (3-1-89)
  15.  *
  16.  * This unit allocates memory via DOS so you don't have to reserve
  17.  * heap space in advance.
  18.  *
  19.  *)
  20.  
  21. {$i prodef.inc}
  22.  
  23. unit DosMem;
  24.  
  25. interface
  26.    uses DOS;
  27.  
  28.    type
  29.       pointer_rec = record
  30.          offset:  word;
  31.          segment: word;
  32.       end;
  33.  
  34. {  var
  35.       dos_prevavail: longint;  }
  36.  
  37.    function dos_maxavail: longint;
  38.    procedure dos_getmem(var ptrvar; size: word);
  39.    procedure dos_freemem(var ptrvar);
  40.  
  41.  
  42. implementation
  43.  
  44.    function dos_maxavail: longint;
  45.    var
  46.       reg:     registers;
  47.    begin
  48.       reg.ah := $48;    {allocate memory}
  49.       reg.bx := $FFFF;  {more than available, force return of freespace}
  50.       msdos(reg);
  51.     { dos_prevavail := longint(reg.bx) shl 4; }
  52.       dos_maxavail := longint(reg.bx) shl 4;
  53.    end;
  54.  
  55.    procedure dos_getmem(var ptrvar; size: word);
  56.    var
  57.       block:   pointer_rec absolute ptrvar;
  58.       reg:     registers;
  59.    begin
  60.       reg.ah := $48;    {allocate memory}
  61.       reg.bx := (size+15) div 16;
  62.       msdos(reg);
  63.  
  64.       if (reg.flags and Fcarry) <> 0 then
  65.       begin
  66.          writeln('dos_getmem: can''t allocate ',size,' bytes.');
  67.          halt(99);
  68.       end;
  69.  
  70.       block.segment := reg.ax;
  71.       block.offset := 0;
  72.    end;
  73.  
  74.    procedure dos_freemem(var ptrvar);
  75.    var
  76.       block:   pointer_rec absolute ptrvar;
  77.       reg:     registers;
  78.    begin
  79.       if (block.segment = 0) and (block.offset = 0) then
  80.          exit;
  81.  
  82.       reg.ah := $49;    {free memory}
  83.       reg.es := block.segment;
  84.       msdos(reg);
  85.  
  86.       if (reg.flags and Fcarry) <> 0 then
  87.       begin
  88.          writeln('dos_freemem: dispose failure');
  89.          halt(99);
  90.       end;
  91.  
  92.       block.segment := 0;
  93.       block.offset := 0;
  94.    end;
  95.  
  96. end.
  97.  
  98.